package com.yeung.aop;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * aop面向切面编程:  抽取横切关注点(模块化),搭积木的形式
 * 简单说就是AOP可以在不修改现有代码的情况下对现有代码增加一些功能，那么这就是AOP最强大的功能。
 *
 *
 * 切面(aspect): 被模块化的特殊对象
 * 通知(advice): 切面必须要完成的工作
 * 目标(target):被通知的对象
 * 代理(proxy): 向目标对象应用通知后创建的对象
 * 连接点(join point): 程序执行的某个特定的位置
 * 切点:(pointcut): 每个类都拥有多个连接点
 * <p>
 * <p>
 * <p>
 * 需求
 * 1 日志: 在程序执行期间追踪正在发生的活动
 * 2. 验证: 西望计算机只能处理正数的运算
 */
public class Main {

    @Test
    public void 测试动态代理的方式实现需求() {
        ArtithmeticCalculatorImp target = new ArtithmeticCalculatorImp();
        ArtithmeticCalculator proxy = new CalculatorProxy(target).getLoggingProxy();

        int result = proxy.add(1, 2);
        System.out.println("--> " + result);
        result = proxy.div(4, 0);
        System.out.println("-->" + result);

    }

    /**
     * 自定义了日志切面类LogingAspect :里边定义了通知
     */
    @Test
    public void 使用aop实现日志功能() {
    //        1. 创建spring的ioc容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans-aop.xml");
    //        2. 从ioc容器中获取bean的实例
        ArtithmeticCalculator bean = (ArtithmeticCalculator) context.getBean("aci");
    //        3. 使用bean
        int add = bean.add(1, 8);
        System.out.println("result-> " + add);
        int result = bean.div(9, 3);
        System.out.println(result);
    }
}
